import http from './request'
import { showToast } from './request'

class ApiService {
  constructor(appKey, sign, workflowHooks) {
    this.appKey = appKey
    this.sign = sign

    // 预制的常用请求参数
    this.baseParams = {
      appKey: this.appKey,
      sign: this.sign,
    }

    // 工作流Hook配置
    this.workflowHooks = {
      PROJECT_SUBMIT: workflowHooks,
    }
  }

  // 工作表ID枚举定义
  static WORKSHEETENUM = {
    PROJECTS: '6876257b872d9db2c7ba529a',
  }

  // "filters":[
  //   {
  //           "controlId":"686df6df33681903aca1068e",
  //           "dataType":2,
  //           "spliceType":1,
  //           "filterType":2,
  //           "value":"61"
  //       }
  //  ]

  /**
   * 获取筛选行数据 - 优化版本
   * @param {string} worksheetId - 工作表ID
   * @param {boolean} notGetTotal - 是否不获取总数
   * @param {Array} filters - 筛选条件
   * @returns {Promise} 返回数据Promise
   */
  async getFilterRows({
    worksheetId,
    pageIndex = 1,
    pageSize = 20,
    notGetTotal = true,
    filters = [],
    useCache = true, // 新增：是否使用缓存
  } = {}) {
    try {
      const requestData = {
        ...this.baseParams,
        worksheetId: worksheetId,
        viewId: '',
        pageIndex: pageIndex,
        pageSize: pageSize,
        notGetTotal: notGetTotal,
        filters: filters,
      }

      // 对于首页数据，使用较短的超时时间
      const options = {
        timeout: pageIndex === 1 ? 8000 : 10000,
      }

      const res = await http.post('/getFilterRows', requestData, options)
      return res
    } catch (error) {
      console.error('获取筛选行数据失败:', error)

      // 提供更友好的错误提示
      const errorMessage = this.getErrorMessage(error)
      showToast(errorMessage)

      throw error
    }
  }

  /**
   * 根据ID获取行数据 - 优化版本
   * @param {string} rowId - 行ID
   * @param {string} worksheetId - 工作表ID
   * @param {boolean} getSystemControl - 是否获取系统控件
   * @returns {Promise} 返回数据Promise
   */
  async getRowById({ rowId, worksheetId, getSystemControl = false } = {}) {
    try {
      const requestData = {
        ...this.baseParams,
        worksheetId: worksheetId,
        rowId: rowId,
        getSystemControl: getSystemControl,
      }

      const res = await http.post('/getRowByIdPost', requestData, {
        timeout: 6000, // 单行数据获取使用更短超时
      })
      return res
    } catch (error) {
      console.error('根据ID获取行数据失败:', error)

      const errorMessage = this.getErrorMessage(error)
      showToast(errorMessage)

      throw error
    }
  }

  /**
   * 批量预加载数据
   * @param {Array} requests - 请求配置数组
   */
  async preloadData(requests = []) {
    const preloadPromises = requests.map((config) => {
      if (config.type === 'getFilterRows') {
        return http.preload(
          '/getFilterRows',
          {
            ...this.baseParams,
            ...config.params,
          },
          'POST',
        )
      } else if (config.type === 'getRowById') {
        return http.preload(
          '/getRowByIdPost',
          {
            ...this.baseParams,
            ...config.params,
          },
          'POST',
        )
      }
    })

    try {
      await Promise.allSettled(preloadPromises)
      console.log('数据预加载完成')
    } catch (error) {
      console.log('预加载失败，但不影响正常使用:', error)
    }
  }

  /**
   * 快速获取候选人数据（带优化）
   */
  async getCandidatesQuick(options = {}) {
    const defaultOptions = {
      worksheetId: ApiService.WORKSHEETENUM.CANDIDATE,
      pageIndex: 1,
      pageSize: 10, // 首次加载较少数据，提高速度
      notGetTotal: false,
      ...options,
    }

    return this.getFilterRows(defaultOptions)
  }

  /**
   * 快速获取项目数据（带优化）
   */
  async getProjectsQuick(options = {}) {
    const defaultOptions = {
      worksheetId: ApiService.WORKSHEETENUM.PROJECTS,
      pageIndex: 1,
      pageSize: 10,
      notGetTotal: false,
      ...options,
    }

    return this.getFilterRows(defaultOptions)
  }

  /**
   * 获取友好的错误信息
   * @param {Error} error - 错误对象
   * @returns {string} 友好的错误信息
   */
  getErrorMessage(error) {
    if (error.message?.includes('timeout')) {
      return '网络超时，请检查网络连接'
    } else if (error.message?.includes('Network Error')) {
      return '网络连接失败，请重试'
    } else if (error.message?.includes('401')) {
      return '登录已过期，请重新登录'
    } else if (error.message?.includes('500')) {
      return '服务器异常，请稍后重试'
    } else {
      return error.message || '请求失败，请重试'
    }
  }

  /**
   * 清除相关缓存
   * @param {string} worksheetId - 工作表ID
   */
  clearWorksheetCache(worksheetId) {
    http.clearCache(worksheetId)
  }

  /**
   * 清除所有API缓存
   */
  clearAllCache() {
    http.clearCache()
  }

  /**
   * 通用的工作流hook提交方法
   * @param {string} hookId - hook ID
   * @param {Object} data - 要提交的数据
   * @returns {Promise} 返回提交结果
   */
  async submitWebhook(hook, data) {
    try {
      // 构建完整的hook地址
      const hookUrl = `/api/workflow/hooks/${hook}`

      // 对于工作流hook，我们需要使用不同的baseURL，直接使用fetch避免baseURL冲突
      const response = await fetch(hookUrl, {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify(data),
      })

      if (!response.ok) {
        throw new Error(`HTTP error! status: ${response.status}`)
      }

      const result = await response.json()
      return result
    } catch (error) {
      console.error('提交项目失败:', error)
      throw error
    }
  }

  /**
   * 更新实例参数的方法
   * @param {string} appKey - 应用密钥
   * @param {string} sign - 签名
   * @param {Object} workflowHooks - 工作流钩子配置
   */
  updateParams(appKey, sign, workflowHooks) {
    this.appKey = appKey
    this.sign = sign

    this.baseParams = {
      appKey: this.appKey,
      sign: this.sign,
    }

    this.workflowHooks = {
      PROJECT_SUBMIT: workflowHooks,
    }
  }
}

// 导出类，让使用者自己创建实例
export { ApiService }
